Create by fall on 29 Dec 2020 Recently revised in 10 Feb 2025
P.S. 本章节只讲述在命令行中的使用
Shell命令行
A Unix shell is both a command interpreter and a programming language.
Unix shell 既是命令解释器,也是编程语言(命令行能用,也能用来编程)。
所有用于解析用户命令,并交给操作系统执行的应用程序,都可以称之为 shell。它有如下特点:
- 简单,体积小。换个角度看,就是低级,不方便。
- Unix / Linux 内置,几乎没有环境依赖。
- 擅长系统操作密集任务,无法胜任计算密集的任务。
linux 操作系统中常见的 shell
sh
:一般情况下是系统的默认 shell。bash
: 在 sh 的基础上增加了一些实用特性,是使用最广泛的 shell。(git bash
)
shell 和 bash 的区别?
执行用户输入内容的,都可以统称为 shell,因此bash 可以算作一个 shell,解析用户命令,并交给操作系统执行
可以在 linux 中直接输入 sh
、bash
切换命令
可以做什么
- 自动化批量部署系统初始化(统一进行设置,时间,安全策略初始化)
- 自动化批量部署程序(软件安装 lamp lnmp ngnix)
- 管理应用程序(kvm 集群管理扩容 缩容 mysql DELL720 批量 RAID)
- 日志分析处理程序(PV UV 200 !200 top 10 grep/awk)
- 自动化备份及数据恢复(mysql 安全备份 / 增量备份 crond)
- 创建代码管理工具,备份代码。
- 自动化信息采集(收集系统 / 应用服务状态信息 CPU EM NETWORK TCP APACHE NGINX MYSQL)【配合zabbix】
- 自动化管理程序(批量远程修改密码,软件升级,配置更新)
- 自动扩容以及减容(阿里云支持增加 / 删除云主机)对重要的应用服务进行调换机器。A--B 避免流量损失
将传统意义上的运维变为自动化,更高效及准确的完成任务,确保公司线上业务的稳定,减少人为干预的风险。
bash 命令
命令格式:命令 [操作] [参数]
多个选项书写方法:ls -la
命令查询和提示
type
:查看某个系统命令是否存在,以及执行的到底是哪一个位置的命令which
:查看某个系统命令是否存在,以及执行的到底是哪一个位置的命令
命令行操作
clear
:清空命令行pwd
:(print work directory):显示当前所在路径cd
:(change directory):切换路径,可以使用相对路径,也可用绝对路径ls
:(list files):显示当前目录所有文件和文件夹。exit
:退出命令行
命令简化:ll
== ls -l
(两个书写方式等价)
# 切换到 e 盘
cd /e
# 进入当前路径下的 fall 目录内
cd ./fall # ./ 可以省略,等价于 cd fall
# 进入根目录 home
cd ~
# 进入上一级目录
cd ..
ls
# 列出所有文件和文件夹,包括隐藏的文件夹
ls -a
# 以长格式显示文件和文件夹,长格式显示多种信息(文件型态、修改时间,权限,文件大小)
ls -l # 等价于 ll
# 将文件根据建立时间先后的顺序列出
ls -r
# 连同子目录的内容一起列出(递归列出),即该目录下的所有文件都会显示
ls -R
文件操作
touch
:创建文件,如果已经存在,则更新修改时间mkdir
:创建文件夹find
:在指定的目录下查找文件。功能非常强大,参数比较多,需要重点掌握。find ./ -name "*.md"
:列出当前目录及其子目录下所有后缀为.md
的文件。
du
(disk usage):显示文件,或者目录夹占用空间大小(占用空间和大小是两回事)-s
:仅显示总数-h
:以K
、M
、G
为单位
cp
(copy):把文件或者文件夹复制到另一个文件中-r
:递归复制,用于目录的复制-f
:覆盖已经存在的目标文件并且不提示-a
:将文件的特性一起复制
rm
(remove):删除文件或文件夹-i
:删除前询问确认是否删除-r
:递归删除,目录下的文件也全部删除-f
:force,忽略警告、不存在的文件,强制删除
mv
(move file)移动文件-f
:文件同名,不会询问,直接覆盖旧文件。-i
:目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。-b
:目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。-u
:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
ln
(link files):为某一个文件在另外一个位置建立一个同步的链接,分硬链接和软链接。- 硬链接的意思是一个档案可以有多个名称(包括路径)
- 软链接的方式则是产生一个特殊的内容,该内容指向原档案的位置。
- 最后一个硬连接失效时,相当于文件从硬盘中移除
- 软连接源文件移除,则文件从硬盘中移除,与软链接引用无关
- dd:从指定文件读取数据写到指定文件
rm -rf /*
(删除所有文件和文件夹)执行后,可以跑路了。
# 创建 test.sh 文件
touch test.sh
# 查看 test.sh 文件
cat test.sh
# 删除 test.sh 文件
rm test.sh
# 创建名为 fall 的文件夹
mkdir fall
mkdir -p ~/fall/zhang # 同时创建 ~/fall 以及 ~/fall/zhang 两个文件夹
# 进入名为 fall 的文件夹内
cd fall
# 查看文件的大小
du test.sh -sh
文件查看
cat
:查看整个文件(适用文件小的场景)less
:从前向后查看文件代码enter
:显示下一行空格
:点击空格键,显示下一页q
:退出文件检索
grep
:用于查找文件里符合条件的字符串。一般用于定位关键词,例如error
-v
排除匹配结果,打印出不符合条件行的内容-n
显示匹配行和行号-i
不区分大小写-c
只统计匹配的行数o
:只显示匹配的字符串本身
wc
:计算文件的 Byte 数、字数、或是列数。-c
:显示Bytes数-l
:显示行数-w
:显示字数
vim
:打开文本编辑器(详见 VIM)。find
:查看路径下所有文件和文件夹,并输出所有子文件,或者检查是否存在
示例:
# 一次显示所有文本
cat test.sh
# 读取部分文本
less test.sh
# 从开头读取部分文本
head test.sh
# 从结尾读取部分文本
tail test.sh
# 查找 test.sh 中的 cd
grep "cd" 2.1-Shell命令行.md -i -n
# 查看 dir 路径下所有文件和文件夹
find dir
判断文件是否存在
-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断 file1 是否比 file2 新 [ "/data/file1" -nt "/data/file2" ]
-ot 判断 file1 是否比 file2 旧 [ "/data/file1" -ot "/data/file2" ]
系统相关
reboot
:重启halt
:关机shutdown
:关机或者重启-h
关机、-r
重启
ps
(process status):显示当前进程的状态-A
:列出所有的进程-w
:显示较多的内容-au
、-aux
:显示较详细的资讯、所有包含其他使用者的行程ps -ef
:查看所有进程
kill
:关闭进程1
:重新加载进程9
:杀死一个进程15
:正常停止一个进程。
# 查看 Linux 内核版本
uname -r
uname -a
# 查看磁盘空间大小和剩余空间
df
# 显示已经运行时间
uptime
# 获取提示
man [operation]
# 查看内存:(Mem:内存大小;Swap:虚拟内存大小)
cat /proc/cpuinfo
# 重启
shutdown -r now
# 关机
shutdown -h now
进程管理
systemctl 命令:systemctl <command> <unit>
command 常用的类型有以下几个
start
启动后面的 unitstop
立刻关闭后面的 unitrestart
立刻重启后面的 unitreload
不关闭的情况下重新载入配置enable
:下次开机时,自动启动disable
:下次开机时,关闭自启动status
:进程的状态
除此之外还有 mask 注销(无法再启动该 unit), unmask 撤销注销,is-active 有没有正在运行,is-enable 有无默认要启动,kill 向进程发送信号,show 列出 unit 配置
# 启动 docker
systemctl start docker
# 重启 docker
systemctl restart docker
# 关闭 docker
systemctl stop docker
# 不关闭的情况下,重新载入配置文件,让设置生效。
systemctl reload docker
# 查看 docker 进程的状态
systemctl status docker
网络相关
ping
(IP 或者域名):查看是否能连接上netstat
(查看网络端口号)-nlptu
curl
ip route show
:查看当前设备的 IP
# 查看是否连接得到 www.github.com
ping www.github.com
# 显示和设置系统的主机名称
ping hostname
修改主机名和 IP 地址的映射:/etc/hosts
我们远程连接的时候用的是 ssh 协议
抓取网页内容,部署项目到 tomcat,或者部署 web 项目
curl www.example.com
用户管理
linux 在管理权限时,分成用户和组的概念(用户和组的关系是多对多)
-
任何用户都属于某个或者某几个组
-
一个组内包含多个用户
命令
who
:查看当前服务器用户列表whoami
:当前用户名adduser
:添加用户,需要 root 权限id
:显示用户的 UID 和 GIDpassword
:配置密码su
(switch user):切换用户su
和su -
的区别是su
只切换了身份,shell 环境仍然是普通用户,su -
连环境也一起切换
userdel
:删除用户-r
:home 路径下的文件夹都没文件权限了
useradd zhangsan
password zhangsan
userdel zhangsan
# 删除张三用户
sudo su - 切换到 root 用户
echo $path 输出可以使用的环境变量
文件权限
使用命令:ll
即可查看当前目录下所有文件的权限
ll
# -rwxr-xr-x 1 19852 197121 19 12月 4 17:21 test.sh*
# -rwxr-x--x 该内容表示权限
第一个字母是文件的类型,然后每三个进行分割,分别是
- 文件所有者的权限(
rwx
) - 文件所属组的权限(
r-x
) - 其他用户的权限(
--x
)
三个字母分别表示对应的权限:
r
:可以读取文件w
:可以向文件中写入内容x
:执行该文件的权限
也会用二进制,或者是仅用数字表示对应权限
原表示法 | 二进制表示 | 转化为数字 |
---|---|---|
rwx | 111 | 7 |
r-x | 101 | 5 |
--x | 001 | 1 |
修改权限
chmod [ugoa] [+-=] [rwx]
权限修改对象:
u
: 拥有者g
:拥有组o
:其他人a
:所有人,以上三者
权限更改方式
+
:添加-
:删除=
:赋值
# 为 1.txt 的拥有者添加执行的权限
chmod u+x 1.txt
chmod g+rwx 1.txt
# 为 myApp 文件夹添加权限
chmod 777 myApp
软件安装
apt-get install zsh
wget
wget http://down.qq.com/lol/dltools/LOL_V4.2.1.1_FULL_0_tgod_signed.exe
-V, --version # 显示 wget 的版本后退出
-h, --help # 打印语法帮助
-b, --background # 启动后转入后台执行
-e, --execute=COMMAND # 执行 ".wgetrc" 格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc
命令行上传,下载
查看 yum 仓库
yum repolist all
rz 选中文件打开
sz 文件名
绿色版(.zip
文件解压直用)
下载 .tar
-> 解压 -> 使用
RPM(RedHat Package Management)
rpm -qa
查询rpm -qa | grep java
筛选查询结果rpm -e
安装:
rpm -ivh [xxx].rpm
-i
表示安装,-v
表示详细输出,-h
表示显示安装进度。
压缩解压
tar(tape archive ):备份压缩解压文件。
# 常用参数:
# -c:建立压缩档案/创建压缩包
# -x:解压
# -t:查看内容
# -r:向压缩归档文件末尾追加文件
# -u:更新原压缩包中的文件
# -f:使用档案名字/执行压缩包文件/解压那个文件
# -z:压缩方式
# -v:显示压缩信息/显示解压过程
# -C:解压位置
压缩
tar -zcvf java.tar.gz 1.txt 2.txt movie
查看
tar -tf java.tar.gz
解压
tar -xvf java.tar.gz
解压到当前文件夹内tar -xvf ./java.tar.gz -C ./java
解压到./java
文件夹内
全局变量
一般来讲,全局变量需要进行配置,配置放在当前用户下的 ~/.bashrc
~/
表示当前用户路径
以 node 为例来配置全局文件
- 如果需要,先解压文件
- 然后将文件移动到 bin 目录下
sudo mv node-v14.17.0 /usr/local/node
- 在
~/.bashrc
中添加export PATH=$PATH:/usr/local/node/bin
- 然后运行
source ~/.bashrc
- 验证安装
node -v
命令历史
Bash 会记录用户执行过的历史命令,保存在 ~/.bash_history
中,默认保存最近 500 条。
history
命令可以查看历史命令。
历史命令可以方便重复执行。最常用的是上下方向键浏览之前的命令。除此之外,利用 !
运算符的历史展开(history expansion)功能,可以快速选取特定命令执行。
!!
:指代上一条命令。!-n
:指代前 n 条命令,比如!-1
即表示!!
。!n
:指代history
列出的命令中行号为 n 的命令。
除了命令,还能指代上一条命令的参数:
!$
:上一个命令的最后一个参数。!*
:上一个命令的所有参数。
mkdir long-dir-name
cd !*
# 回车后,展开为 cd long-dir-name
还有一个非常实用的功能:根据关键字查找最近执行的命令,称为 reverse-i-search。按下快捷键 Ctrl + R
,出现提示后,输入关键字,会匹配出历史中最近的一个命令。此时,回车可以立即执行,再按 Ctrl + R
会继续向上搜索。
命令别名
别名(alias)可以把一个命令(及其一部分参数)定义为一个新命令。利用别名,用户简化一些常用的命令,大大减少常用命令的键击。
alias
命令用于创建别名:
alias ll='ls -al'
# ll 会被替换成 ls -al 执行
ll
# ls 原来的参数也可以正常支持
ll -d my-dir
alias
创建的别名只在当前会话有效,重启终端后,别名就不存在了。如果希望创建一个持久化的别名,可以在 shell 的配置文件中加入别名声明。bash 的配置文件是 ~/.bashrc
。
~/.bashrc
# ...
# Aliases
# alias alias_name="command_to_run"
# Long format list
alias ll="ls -al"
每次启动时,shell 都会读取该配置进行初始化,这些别名就可以使用了。
获取帮助
help
能够显示内置命令的用法。
help type
# type: type [-afptP] name [name ...]
# Display information about command type.
# ...
help ls
# bash: help: no help topics match `ls'.
man
查看使用手册(过时的文档格式,因使用广泛一般会有用)
大部分命令会带有使用手册(manual page)介绍命令的语法和详细的作用
man ls
info
能支持超链接的 info 格式提供帮助文档
apropos
能够根据关键字搜索出相关的命令。
apropos rename file
help
查看命令行提供的帮助
VIM
vim 文本编辑器,广泛用于程序开发和文本编辑(纯命令行的文本编辑器,强调键盘操作,而不是鼠标)
打开文件:vim filename
- 普通模式:用于导航和执行命令。启动 vim 时默认进入此模式。
- 插入模式:用于文本输入。按
i
进入插入模式,按Esc
返回普通模式。 - 命令模式:用于执行命令。按
:
进入命令模式。
三种模式:编辑模式(o i)、命令模式(进入后默认)、行末模式(set nu)
命令模式
- 保存文件:在命令模式下输入
:w
并按Enter
。 - 退出Vim:在命令模式下输入
:q
并按Enter
。如果未保存更改,可以使用:q!
强制退出。 - 保存并退出:在命令模式下输入
:wq
并按Enter
。 - 另存为:
:w filename
另存为文件
文本编辑
- 插入文本:按
i
进入插入模式,输入文本后按Esc
返回普通模式。 - 删除字符:在普通模式下,按
x
删除光标下的字符。 - 撤销操作:在普通模式下,按
u
撤销上一步操作。
导航
- 上下左右移动:使用箭头键或
h
(左)、j
(下)、k
(上)、l
(右)进行移动。 - 跳转到行首/行尾:按
0
跳转到行首,按$
跳转到行尾。 - 跳转到特定行:在命令模式下输入
:行号
(例如:10
跳转到第10行)。
查找和替换
- 查找:在命令模式下输入
/keyword
并按Enter
,使用n
查找下一个匹配项。 - 替换:在命令模式下输入
:%s/旧词/新词/g
进行全局替换。
可以通过编辑 ~/.vimrc
文件来配置 vim,添加插件以扩展功能。
快捷键
Tab
:自动补全,支持文件、命令、参数、用户名、主机名等。两次 Tab 可列出所有可选的自动补全项。
Ctrl + A/E
: 移动到行首/尾。
Ctrl + U/K
: 清除光标位置到行首/尾的字符。
Ctrl + C
: 中止正在执行的命令。
Ctrl + L
: 清空 shell 打印内容。同命令 clear。
Ctrl + D
: 关闭 shell 会话。
命令语法
文档上会给出一些命令的使用方式,读懂给出的命令使用方式很重要
git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
[--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
[-u | --set-upstream] [-o <string> | --push-option=<string>]
[--[no-]signed|--signed=(true|false|if-asked)]
[--force-with-lease[=<refname>[:<expect>]] [--force-if-includes]]
[--no-verify] [<repository> [<refspec>…]]
具有特定意义的符号:
[]
表示可选的部分,可以嵌套。|
表示左右两边互斥。< >
表示需要被实际内容替换的部分。...
表示可以存在多个值。
命令运算符
运算符 | 含义 |
---|---|
; | 顺序执行命令,即使上一条命令执行失败了(退出码非 0),也不会因为出错而终止。 |
&& | 把几个命令的逻辑组合在一起,前面的命令执行成功(退出码为 0),才执行后面的命令 |
` | |
` | ` |
& | 表示启动一个子 shell 进程在后台异步执行这个命令,结果输出到当前 shell。 |
{} | 可以把几个代码放到一个相同的执行上下文中。但并不影响变量作用域 一般见于函数声明处。还有一个场景是实现多条命令的重定向 |
# 分别创建三个文件夹
mkdir what; mkdir vue; mkdir react
# 创建文件夹,创建成功后再进入
mkdir fall && cd fall
# 如果为 true,执行 true,否则执行 false
true && echo true || echo false
# history 返回数百条用户历史命令
# grep 匹配出只带有"echo"单词的历史
# less 会将过滤后的历史以滚动查看的方式展示
history | grep "echo" | less
# 命令 1,2 在后台运行,3 在前台运行
# 可以用来同时启动多个任务。
command1 & command2 & command3
# 如果去掉大括号,重定向的优先级更高,只会影响 cat 命令。
{ echo "file content: "; cat source_file } > target_file
参考文章
作者 | 链接 |
---|---|
ICer消食片 | https://zhuanlan.zhihu.com/p/455678992 |
czpcalm | https://juejin.cn/post/7130982053528469511 |
华东师范大学 | linux教程 |